Amazon Linux AMI 2014.03 Released! 早速ハマったこと (Perl・glibc編)
OpenSSLの脆弱性(CVE-2014-0160)が公開されました。
Amazon Linuxでは、openssl-1.0.1e-37.66 (参考:ALAS-2014-320) で対応済ですが、
この記事の手順でリポジトリをAmazon Linux 2013.09に固定している際は、提供されません。
/etc/yum.confで「releasever=latest」を有効にして、yum update opensslを実行することを強くお勧めします。
ただし、依存関係により、glibcが2.17へアップデートされますので、
十分に動作検証した上で本番適用することをお勧めします。
こんにちは、三井田です。
佐々木さんが『Amazon Linux AMI 2014.03 Released! 早速試してみた』というエントリーをアップしてますが、エントリーに気づかず小一時間ハマったことをレポートしたいと思います。
罠ストーリーは突然に
OTRSの利用を本格的に考えてまして、日本OTRSユーザ会さんがGithubで公開しているインストーラを使ってAmazon Linuxへの1発インストールを試みていました。
先週は、さくっと入ったのですが、今日の午後、新しくインスタンスを立ち上げて試してみると、次のようなエラーでyum installが失敗しました。
エラー: パッケージ: perl-Encode-HanExtra-0.23-3.el6.x86_64 (epel) 要求: perl(:MODULE_COMPAT_5.10.1) エラー: パッケージ: perl-Params-Classify-0.013-5.el6.x86_64 (epel) 要求: perl(:MODULE_COMPAT_5.10.1) エラー: パッケージ: perl-PDF-API2-2.019-2.el6.noarch (epel) 要求: perl(:MODULE_COMPAT_5.10.1) エラー: パッケージ: perl-Crypt-Eksblowfish-0.009-5.el6.x86_64 (epel) 要求: perl(:MODULE_COMPAT_5.10.1) エラー: パッケージ: perl-Class-Mix-0.005-5.el6.noarch (epel) 要求: perl(:MODULE_COMPAT_5.10.1) 問題を回避するために --skip-broken を用いることができます。 これらを試行できます: rpm -Va --nofiles --nodigest
原因
しばらく悩んだのち注目したのは、「(epel)」と「要求: perl(:MODULE_COMPAT_5.10.1)」でした。
perlは入っているはず・・・
[ec2-user ~]$ perl --version This is perl 5, version 16, subversion 3 (v5.16.3) built for x86_64-linux-thread-multi (with 24 registered patches, see perl -V for more detail)
え、5.16?
[ec2-user ~]$ cat /etc/system-release Amazon Linux AMI release 2014.03
え、2014.03?? Perlのバージョンの違いから、OSのバージョン違いに気づくという・・・へまをしておりました。
Amazon Linuxに入っているEPEL6は、RHEL6/CentOS6を衝突を起こさず拡張するポリシーで運用されているリポジトリです。依存関係でコケたパッケージは、左記RHEL/CentOSに含まれるPerl 5.10.1をターゲットに対してビルドされているため、Amazon Linux 2014.03のPerl 5.16では依存関係を満たさなくなってしまっていたのです。
罠その弐:glibcという伏兵
先週問題なかったということは、Amazon Linux AMI 2013.09であればいいのです。 しかし、ことはそう単純ではありませんでした。
今度は、次のようなエラーでパッケージのインストールに失敗します。
エラー: パッケージ: glibc-devel-2.12-1.132.45.amzn1.i686 (amzn-updates) 要求: glibc = 2.12-1.132.45.amzn1 インストール: glibc-2.17-36.80.amzn1.i686 (@amzn-main/latest) glibc = 2.17-36.80.amzn1 利用可能: glibc-2.12-1.107.43.amzn1.i686 (amzn-main) glibc = 2.12-1.107.43.amzn1 利用可能: glibc-2.12-1.132.45.amzn1.i686 (amzn-updates) glibc = 2.12-1.132.45.amzn1 エラー: パッケージ: glibc-headers-2.12-1.132.45.amzn1.i686 (amzn-updates) 要求: glibc = 2.12-1.132.45.amzn1 インストール: glibc-2.17-36.80.amzn1.i686 (@amzn-main/latest) glibc = 2.17-36.80.amzn1 利用可能: glibc-2.12-1.107.43.amzn1.i686 (amzn-main) glibc = 2.12-1.107.43.amzn1 利用可能: glibc-2.12-1.132.45.amzn1.i686 (amzn-updates) glibc = 2.12-1.132.45.amzn1 問題を回避するために --skip-broken を用いることができます。 これらを試行できます: rpm -Va --nofiles --nodigest
原因
リリースノートに、「Glibc has been updated from 2.12 to 2.17」とあったことと、 Amazon Linuxは、デフォルトでは起動時に重要なパッケージは自動でアップデートがかかること、 その際、最新のバージョンのリポジトリからアップデートされることを思い出しました。
バッチリ、アップデートされていました。
$ rpm -qa | grep glibc glibc-2.17-36.80.amzn1.i686 glibc-common-2.17-36.80.amzn1.i686
解決:ではどうすればいいのか
これまでのことから、Amazon Linux AMI 2014.03ではなく、Amazon Linux AMI 2013.09を 2013.09リリースのリポジトリに固定して使えば良いこととなります。 その手順を紹介したいと思います。
- 「Launch Instance」よりウィザードを開き、「Community AMIs」を選びます
- Amazon Linux、さらに、2013.09で絞込み、i386/x86_64、PV/HVMなどお好みのAMIを「Select」します
- 次が重要です。2013.09に固定するようにuser-dataに次の値を入力します
※参考:FAQ:AMI を特定のバージョンに固定するにはどうすればよいですか?#cloud-config repo_releasever: 2013.09
別の方法としては、以下を入力して初回起動時のアップデートを行わないようにし、後に/etc/yum.confの「releasever=latest」行をコメントアウトしても対応可能です。
※参考:FAQ:初回起動時に非常に重要なセキュリティアップデートの自動インストールを無効にするにはどうすればよいですか?#cloud-config repo_upgrade: none
まとめ
- Amazon Linuxには、EPEL6のリポジトリ設定がデフォルトで入ってますが、Perlやglibcのバージョンアップによって、EPEL6のパッケージが使えないケースも多くなりそうです。その場合、ソースまたはEPEL6のSRPMからビルドし直すなどが必要になるかと思います。
- RHELやCentOSと異なり、Amazon Linuxは短期間で大きな変更があります。リポジトリを固定するなど、新バージョンは十分な動作検証を行ってから本番運用に導入するように気をつけましょう。
- 最後に:マネジメントコンソールからポチポチと起動出来るのは手軽です。しかし、画面をちゃんと読んで指差し確認をして起動しましょう(笑)